package cn.stimd.spring.beans.factory.config;

import cn.stimd.spring.beans.BeansException;

import java.lang.reflect.Constructor;

/**
 * Created by Stimd
 * 项目地址：https://gitee.com/stimd/spring-wheel
 * 公众号：Java编程探微
 */
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
    /**
     * 完成定制的依赖注入和依赖检查，比如@Autowired、@Resource、@PersistContext
     */
    void postProcessPropertyValues(Object bean, String beanName);

    /**
     * 提前创建代理对象，用于解决循环依赖的问题
     */
    Object getEarlyBeanReference(Object bean, String beanName);

    /**
     * 在实例化对象之前调用，返回的可能是一个代理
     */
    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;


    /**
     * 从Bean的候选构造器中选择一个合适的
     */
    default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName){
        return null;
    }
}
